package com.zhss.demo.concurrent;

import java.util.LinkedList;

/**
 * 实现简单内存队列，体验wait和notify的作用
 */
public class MyQueue {

    private  final  static int MAX_SIZE = 100;

    private  LinkedList<String> queue  = new LinkedList<>();

    public synchronized void offer(String element) {
        try {
            if (queue.size() == MAX_SIZE){
                // 一个线程只要执行到这一步，已经获取到了一把锁
                // 这时候队列满了  但是线程又获取了这把锁，使用wait会让一个线程释放这把锁，并且让线程处于等待状态
                wait();
            }
            queue.addLast(element);
            notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    public synchronized String take() {
        // 别的线程和可以从队列中take数据
        String element = null;

        try {
            if (queue.size() == 0){
                wait();
            }
             element = queue.removeFirst();
             // 当获取了数据之后,唤醒等待的线程，使得线程又可以往队列中加数据
             notifyAll();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return element;
    }


}
